﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using static WenSkin.Controls.WenButton;

namespace WenSkin.Controls
{
    public class WenPaging : WenControl, ISupportInitialize
    {
        public WenPaging() : base()
        {
            int width = 414;
            int height = 32;
            int buttonWidth = 68;

            this.Size = new Size(width, height);
            WenButton bePageButton = new WenButton()
            {
                Location = new Point(1, 1),
                Size = new Size(buttonWidth, height - 2),
                Text = "上一页",
            };
            bePageButton.Click += (s, e) =>
            {
                if (PageIndex > 1)
                {
                    OnPagingButtonClick(new PagingButtonClickEventArgs(PageIndex - 1));
                }
            };
            WenButton nextPageButton = new WenButton()
            {
                Location = new Point(width - buttonWidth - 1, 1),
                Size = new Size(buttonWidth, height - 2),
                Text = "下一页",
                Anchor = AnchorStyles.Right | AnchorStyles.Top
            };
            nextPageButton.Click += (s, e) =>
            {
                if (PageIndex < MaxPageCout)
                {
                    OnPagingButtonClick(new PagingButtonClickEventArgs(PageIndex + 1));
                }
            };

            flow = new FlowLayoutPanel()
            {
                Location = new Point(1 + buttonWidth + 1, 1),
                Size = new Size(width - buttonWidth * 2 - 2, height - 2),
                Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom,
            };

            this.Controls.Add(bePageButton);
            this.Controls.Add(nextPageButton);
            this.Controls.Add(flow);
        }

        #region 私有属性

        private readonly FlowLayoutPanel flow;
        private int pageIndex = 1;
        //private int maxPageButtonCount = 6;
        private readonly int pageButtonWidth = 38;
        private int maxPageCout = 1;
        private Color selectedPageColor = Color.FromArgb(63, 63, 70);

        #endregion

        #region 公有属性

        [Category("Wen"), Description("获取当前页数"), DefaultValue(1)]
        public int PageIndex { get => pageIndex; set { pageIndex = value; RefreshButton(); } }
        [Category("Wen"), Description("获取或设置最大页数"), DefaultValue(1)]
        public int MaxPageCout { get => maxPageCout; set { maxPageCout = value; RefreshButton(); } }

        [Category("Wen"), Description("是否自动调节控件宽度"), DefaultValue(false)]
        public bool AutoSizeWidth { get; set; }

        [Category("Wen"), Description("是否自动调节控件宽度"), DefaultValue(typeof(Color), "63,63,70")]
        public Color SelectedPageColor { get => selectedPageColor; set { selectedPageColor = value;this.Invalidate(); } }
        #endregion

        #region 按钮刷新

        private void RefreshButton()
        {
            flow.Controls.Clear();
            //先绑定第一页
            WenButton wenButtonOne = new WenButton("1")
            {
                Width = pageButtonWidth,
                Margin = new Padding(1, 0, 0, 0),
            };
            if (PageIndex == 1)
            {
                wenButtonOne.BackColor = SelectedPageColor;
            }
            wenButtonOne.Click += (s, e) =>
            {
                OnPagingButtonClick(new PagingButtonClickEventArgs(1));
            };
            flow.Controls.Add(wenButtonOne);

            if (maxPageCout < 2)
                return;

            int startIndex = 2;
            int endIndex = maxPageCout - 1;

            if (PageIndex - 2 > 1 && PageIndex + 2 < maxPageCout)
            {
                endIndex = PageIndex + 2;
                startIndex = PageIndex - 2;
            }
            else if (PageIndex - 2 < 2 && 7 - 1 < maxPageCout)
            {
                startIndex = 2;
                endIndex = 7 - 1;
            }
            else if (PageIndex - 2 < 1 && 7 - 1 > maxPageCout)
            {
                startIndex = 2;
                endIndex = maxPageCout - 1;
            }
            else if (PageIndex + 2 >= maxPageCout && maxPageCout - (7 - 2) > 1)
            {
                startIndex = maxPageCout - (7 - 2);
                endIndex = maxPageCout - 1;
            }

            for (int i = startIndex; i <= endIndex; i++)
            {
                int index = i;
                WenButton wenButton = new WenButton((i).ToString())
                {
                    Width = pageButtonWidth,
                    Margin = new Padding(1, 0, 0, 0),
                };
                if (PageIndex == i)
                {
                    wenButton.BackColor = SelectedPageColor;
                }
                wenButton.Click += (s, e) =>
                {
                    OnPagingButtonClick(new PagingButtonClickEventArgs(index));
                };
                flow.Controls.Add(wenButton);
            }
            //绑定最后一页
            WenButton wenButtonLast = new WenButton(maxPageCout.ToString())
            {
                Width = pageButtonWidth,
                Margin = new Padding(1, 0, 0, 0),
            };
            if (PageIndex == maxPageCout)
            {
                wenButtonLast.BackColor = SelectedPageColor;
            }
            wenButtonLast.Click += (s, e) =>
            {
                OnPagingButtonClick(new PagingButtonClickEventArgs(maxPageCout));
            };
            flow.Controls.Add(wenButtonLast);


            if (AutoSizeWidth)
            {
                this.Width = 70 * 2 + flow.Controls.Count * (pageButtonWidth + 1) + 1;
            }
        }

        #endregion

        #region 重绘
        protected override void WenOnPaint(Graphics g, Rectangle rec, PaintEventArgs e)
        {
            base.WenOnPaint(g, rec, e);
            g.DrawRectangle(Pens.Gray, 0, 0, Width - 1, Height - 1);
        }
        #endregion
        public void BeginInit()
        {

        }

        public void EndInit()
        {
            RefreshButton();
        }

        #region 委托

        public delegate void PagingButtonClickEventHandler(object sender, PagingButtonClickEventArgs e);
        [Category("Wen"), Description("按钮点击事件")]
        public event PagingButtonClickEventHandler PagingButtonClick;
        public class PagingButtonClickEventArgs : EventArgs
        {
            private readonly int pageIndex;

            public PagingButtonClickEventArgs(int pageIndex)
            {
                this.pageIndex = pageIndex;
            }

            public int PageIndex => pageIndex;
        }

        protected virtual void OnPagingButtonClick(PagingButtonClickEventArgs e)
        {
            PageIndex = e.PageIndex;
            PagingButtonClick?.Invoke(this, e);
        }

        #endregion     
    }
}
